Germán Samartino

Primer cuatrimestre 2022


1 Introducción

Como práctica para la presentación de un trabajo que hayamos realizado, vamos a trabajar con un nuevo juego de datos que podemos descargar desde https://data.buenosaires.gob.ar/dataset/bicicletas-publicas . Este set de datos contiene informacion asociada a los viajes en las ecobicis de la Ciudad Autonoma de Buenos Aires durante el 2021. Retomando lo que vimos en el taller anterior, vamos a intentar construir visualizaciones que nos permitan ver varias cosas sobre la estacion que mas demanda de bicicletas tenga:

  • 1. ¿Hacia dónde se dirige la gente desde esa estación?
  • 2. ¿Cómo evolucionó el uso durante el año?
  • 3. ¿Qué día de la semana se usa más?
  • 4. ¿A qué hora crece la demanda?

2 Exploración de las bases

Primero cargaremos los paquetes que vamos a utilizar

library(tidyverse) # Set de herramientas inicial
library(lubridate) # Manejo de Fechas
library(viridis) # Escala de colores en nuestras visualizaciones
library(plotly) # Interacción a nuestras visualizaciones
library(kableExtra) # Visualizaciones de tablas

Luego cargamos la bases que vamos a utilizar. Recordemos que podemos obtener la ubicación del archivo a partir de la función file.choose(). Y luego pegar el resultado de esa función en read_csv().

bicis_21 <- read_csv("recorridos_realizados_2021.csv")

También podríamos usar directamente la ubicación desde internet. Para esto último lo que debemos hacer es, en lugar de dar click al botón Descargar como siempre, le damos click derecho y seleccionamos “Copiar la dirección del enlace”. Aca hay que prestar atención a que la dirección que nos trae termine en ‘.csv’. Recordemos que esto nos garantiza estar utilizando siempre la última versión de los datos, pero con la necesidad de estar conectades a internet y de esperar cada vez que corro mis datos a que se descarguen los datos (que podrían ser pesados).

Ahora solo debemos pegar esa ubicación en nuestro read_csv() (recuerden, la ruta del archivo va siempre entre comillas)

id_recorrido Duracion Recorrido fecha_origen_recorrido id_estacion_origen nombre_estacion_origen direccion_estacion_origen long_estacion_origen lat_estacion_origen fecha_destino_recorrido id_estacion_destino nombre_estacion_destino direccion_estacion_destino long_estacion_destino lat_estacion_destino id_usuario modelo_bicicleta
10758473BAEcobici 591 2021-04-10 20:38:24 UTC 2BAEcobici 002 - Retiro I Ramos Mejia, Jose Maria, Dr. Av. & Del Libertador Av. -58.37472 -34.59242 2021-04-10 20:48:15 UTC 95BAEcobici 095 - ESMERALDA ESMERALDA 516 -58.37817 -34.60211 86840BAEcobici ICONIC
10757803BAEcobici 1321 2021-04-10 16:34:08 UTC 2BAEcobici 002 - Retiro I Ramos Mejia, Jose Maria, Dr. Av. & Del Libertador Av. -58.37472 -34.59242 2021-04-10 16:56:09 UTC 73BAEcobici 073 - Ruy Díaz de Guzmán Avenida Martin Garcia y Ruy Díaz de Guzmán -58.37182 -34.63068 52860BAEcobici ICONIC
10756603BAEcobici 380 2021-04-10 07:06:00 UTC 3BAEcobici 003 - ADUANA Moreno & Av Paseo Colon -58.36826 -34.61103 2021-04-10 07:12:20 UTC 150BAEcobici 150 - RODRIGO BUENO Av. España 2200 -58.35547 -34.61875 375594BAEcobici ICONIC
10756618BAEcobici 1436 2021-04-10 07:25:08 UTC 4BAEcobici 004 - Plaza Roma Lavalle & Bouchard -58.36878 -34.60182 2021-04-10 07:49:04 UTC 353BAEcobici 237 - Madero Office 367 Sanchez De Thompson, Mariquita -58.36469 -34.59904 489972BAEcobici ICONIC
10757830BAEcobici 3736 2021-04-10 16:45:01 UTC 4BAEcobici 004 - Plaza Roma Lavalle & Bouchard -58.36878 -34.60182 2021-04-10 17:47:17 UTC 207BAEcobici 123 - BASUALDO Y RODO Basualdo 1218 -58.49263 -34.64932 77965BAEcobici ICONIC
10757832BAEcobici 3681 2021-04-10 16:45:11 UTC 4BAEcobici 004 - Plaza Roma Lavalle & Bouchard -58.36878 -34.60182 2021-04-10 17:46:32 UTC 207BAEcobici 123 - BASUALDO Y RODO Basualdo 1218 -58.49263 -34.64932 764009BAEcobici ICONIC

Una primera cuestión que podemos ver es que una de nuestras variables, “Duracion Recorrido”, tiene caracteres en mayúsculas, minúsculas y también tiene espacios. Esto es algo que sucede con frecuencia, y que puede traernos algunas dificultades más adelante. Para eso, podemos usar el paquete janitor, que viene a simplificar algunas cuestiones referidas a la exploración y el procesamiento de los datos. En principio vamos a utilizar la función clean_names(), para estandarizar el nombre de las columnas de manera rápida y sencilla. Esta es una muy buena práctica para antes de empezar a manipular nuestra base de datos. Aquí las demás columnas ya vienen con ese formato “limpio”, por lo que sólo vamos a observar cambios en el nombre de Duracion Recorrido.

Como para esta instancia sólo nos interesa la función clean_names() dentro de ese paquete, lo que hacemos es, en vez de descargar el paquete entero y llamarlo, escribimos el nombre del paquete, seguido de dos puntos escritos dos veces (::), y luego la función que queremos usar:

bicis_21_j <- bicis_21 %>% 
  janitor::clean_names()
id_recorrido duracion_recorrido fecha_origen_recorrido id_estacion_origen nombre_estacion_origen direccion_estacion_origen long_estacion_origen lat_estacion_origen fecha_destino_recorrido id_estacion_destino nombre_estacion_destino direccion_estacion_destino long_estacion_destino lat_estacion_destino id_usuario modelo_bicicleta
10758473BAEcobici 591 2021-04-10 20:38:24 UTC 2BAEcobici 002 - Retiro I Ramos Mejia, Jose Maria, Dr. Av. & Del Libertador Av. -58.37472 -34.59242 2021-04-10 20:48:15 UTC 95BAEcobici 095 - ESMERALDA ESMERALDA 516 -58.37817 -34.60211 86840BAEcobici ICONIC
10757803BAEcobici 1321 2021-04-10 16:34:08 UTC 2BAEcobici 002 - Retiro I Ramos Mejia, Jose Maria, Dr. Av. & Del Libertador Av. -58.37472 -34.59242 2021-04-10 16:56:09 UTC 73BAEcobici 073 - Ruy Díaz de Guzmán Avenida Martin Garcia y Ruy Díaz de Guzmán -58.37182 -34.63068 52860BAEcobici ICONIC
10756603BAEcobici 380 2021-04-10 07:06:00 UTC 3BAEcobici 003 - ADUANA Moreno & Av Paseo Colon -58.36826 -34.61103 2021-04-10 07:12:20 UTC 150BAEcobici 150 - RODRIGO BUENO Av. España 2200 -58.35547 -34.61875 375594BAEcobici ICONIC
10756618BAEcobici 1436 2021-04-10 07:25:08 UTC 4BAEcobici 004 - Plaza Roma Lavalle & Bouchard -58.36878 -34.60182 2021-04-10 07:49:04 UTC 353BAEcobici 237 - Madero Office 367 Sanchez De Thompson, Mariquita -58.36469 -34.59904 489972BAEcobici ICONIC
10757830BAEcobici 3736 2021-04-10 16:45:01 UTC 4BAEcobici 004 - Plaza Roma Lavalle & Bouchard -58.36878 -34.60182 2021-04-10 17:47:17 UTC 207BAEcobici 123 - BASUALDO Y RODO Basualdo 1218 -58.49263 -34.64932 77965BAEcobici ICONIC
10757832BAEcobici 3681 2021-04-10 16:45:11 UTC 4BAEcobici 004 - Plaza Roma Lavalle & Bouchard -58.36878 -34.60182 2021-04-10 17:46:32 UTC 207BAEcobici 123 - BASUALDO Y RODO Basualdo 1218 -58.49263 -34.64932 764009BAEcobici ICONIC

3 Antes que nada…

Lo primero que tenemos que identificar, previo a pensar en resolver las preguntas planteadas, es cuál es la estación con mayor demanda de bicicletas. Como tenemos una variable con el nombre las estaciones, utilizaremos esa como variable categórica. Y veremos la frecuencia de cada uno de los distintos valores que podía tomar (niveles de mi variable categórica o factor).

nodo_salida_mas_importante <- bicis_21_j %>% 
  count(nombre_estacion_origen,
        sort = T,
        name = 'cantidad_salidas')%>% 
  top_n(10)

Usamos Kable para mostrar los primeros 10 resultados de esa frecuencia (es decir, los valores contenidos en nodo_salida_mas_importante).

kable(nodo_salida_mas_importante) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), font_size = 12, full_width = F, position = "left") %>% 
  column_spec(1, background = "orange")
nombre_estacion_origen cantidad_salidas
014 - Pacifico 36260
160 - Godoy Cruz y Libertador 32535
029 - Parque Centenario 30853
005 - Plaza Italia 28644
096 - Carlos Gardel 27579
255 - BARRANCAS DE BELGRANO 27256
292 - PLAZA BOLIVIA 26875
147 - Constitución 26263
009 - Parque Las Heras 26103
121 - YATAY 25158

Excelente! Comenzaremos a trabajar sobre la estación 014 - Pacifico, que se encuentra a metros de Juan B Justo y Santa Fe.

4 Ejercicios

4.1 ¿Hacia dónde se dirige la gente desde esa estación?

Bueno, ahora vamos a trabajar sobre nuestros datos. Como queremos saber hacia dónde se dirige la gente que saca bicicletas en nuestra estación con mayor demanda, primero debemos filtrar los registros para quedarnos solamente con los que efectivamente salen de ahí. Luego, decidimos filtrar también para que el lugar de devolución de la bicicleta sea otra estación; esto es un criterio teórico y dependerá de lo que se quiera ver, pero para casos prácticos vamos a armar el filtro con ambas condiciones. Una vez realizado, podemos directamente usar la función count(). Esta vez queremos ver la frecuencia de la variable categórica nombre_estacion_destino. Además, le agregamos la variable name igualada a un valor en formato character (siempre entre comillas). De esta manera le estamos pidiendo a R que no ponga el nombre que suele poner por defecto cuando uso la función count().

destinos_desde_pacifico <- bicis_21_j %>% 
  filter(nombre_estacion_origen == '014 - Pacifico' &
           nombre_estacion_destino != '014 - Pacifico') %>% 
  count(nombre_estacion_destino,
        sort = T,
        name = 'cantidad_salidas_desde_pacifico') 

Veamos entonces cómo quedará nuestra visualización. Utilizaremos geom_bar() definiendo los valores a visualizar en los ejes en aes() . Pero primero nos quedaremos solo con los primeros 10 valores para que la visualización no nos quede poco interpretable, utilizando la función top_n(). Dentro de ggplot, utilizaremos la funcion reorder() para cuando le indiquemos nuestro eje x. De esta manera, ordena de manera dinámica nuestros valores del eje x a partir de otro valor. Vemos que también agregamos una capa nueva scale_fill_viridis(discrete = T) . Esto es lo que nos dará una escala de colores para nuestros datos. Debemos indicar que nuestra variable de eje horizontal es discreta, es decir, no puede tomar infinitos valores como las variables continuas. Otra capa que no habíamos visto es theme(legend.position = “none”). Esta capa hace que R no nos muestre las referencias, ya que sobran.

destinos_desde_pacifico %>% 
  top_n(10, cantidad_salidas_desde_pacifico) %>% 
  ggplot(aes(x=reorder(nombre_estacion_destino,
                       cantidad_salidas_desde_pacifico),
             weight=cantidad_salidas_desde_pacifico))+
  geom_bar(aes(fill = factor(nombre_estacion_destino))) +
  scale_fill_viridis(discrete = T) +
  theme_minimal() +
  theme(legend.position = "none") +
  coord_flip() +
  labs(x = 'Estación',
       y = 'Cantidad de llegadas',
       title = 'Cantidad de llegadas por estación',
       subtitle = 'desde Pacífico',
       caption = 'Fuente de datos: https://data.buenosaires.gob.ar/')

4.2 ¿Cómo evolucionó el uso durante el año para esa estación de bicicletas?

Trabajemos sobre nuestros datos. Primero volveremos a aplicar nuestro filtro para quedarnos sólo con los viajes salidos desde Pacífico, que no la tengan como estación de destino, pero, ¿Podríamos haber generado un sub-set de datos intermedio con este filtro y no repetir código? Sería una buena práctica, dado que repetir código nos lleva a que si en algún momento encontramos algún error en nuestra lógica, deberíamos ir a modificarla cada vez que repetimos código.

bicis_21_pacífico<-bicis_21_j %>% 
  filter(nombre_estacion_origen == '014 - Pacifico',
         nombre_estacion_destino != nombre_estacion_origen)

Bueno, volviendo a lo nuestro: si queremos ver la evolución por fecha lo primero que deberíamos hacer es dejar nuestro campo fecha en el formato correcto. Como vemos viene en un formato donde también incluye la hora: para eso, primero lo convertimos a un formato que lubridate pueda entender con la función parse_date_time() (esto se llama “parseado”) y luego le pedimos que lo pase a fecha sin horario mediante as_date() . Finalmente hacemos un count para contar la frecuencia de cada fecha.

viajes_desde_pacifico_que_fecha <- bicis_21_pacífico %>%
  mutate(fecha_de_inicio = parse_date_time(fecha_origen_recorrido, 'ymd HMS'),
         dia_inicio = as_date(fecha_de_inicio)) %>%
  count(dia_inicio) 

Veamos cómo queda entonces la visualización. Utilizaremos geom_line() definiendo los valores a visualizar en los ejes en aes() . Además vemos que en el aes propio del geom_line(), podemos definir detalles como el color y el tamaño de la línea.

visualizacion_viajes_por_fecha <- viajes_desde_pacifico_que_fecha %>% 
  ggplot(aes(x=dia_inicio, y = n)) + 
  geom_line(color = 'green3', size = .5)+
  theme_minimal() +
  theme(legend.position = "none") +
  labs(x = 'Dia',
       y = 'Cantidad de salidas',
       title = 'Cantidad de salidas por día desde Pacífico')

ggplotly(visualizacion_viajes_por_fecha, tooltip = c("x", "y"))

5 Conclusión

En esta clase exploramos herramientas para presentar el trabajo que hicimos, acompañando los datos explorados con una explicación de los pasos y las decisiones tomadas. Como vimos, Rmarkdown contiene una cantidad de parámetros muy numeroso, que nos va a permitir acomodar visualmente la salida a lo que queramos mostrar.

6 Actividad adicional

Les dejamos dos ejercicios a modo de trabajo práctico opcional para que continúen explorando los datos y pongan en práctica los contenidos vistos hasta ahora. Les proponemos que lo resuelvan realizándolo en un archivo .rmd!

6.1 ¿Qué día de la semana se usa más?

Para saber qué día de la semana se usa más la ecobici en la estación con mayor demanda, lo primero que haremos será cambiar el formato de la fecha para saber qué día de la semana corresponde a cada registro. Entonces, utilizando el data set bicis_21_pacifico, agregamos una nueva variable en formato lubridate a la cual le asignamos la fecha de origen. Con la función wday() sabemos a qué dia de la semana corresponde cada registro. Por ultimo, contamos los registros anuales para cada día de la semana, pudiendo manipularla como variable categórica al settear label = True

dia_con_mas_demanda <- bicis_21_pacífico %>%
  mutate(fecha_de_inicio = parse_date_time(fecha_origen_recorrido, 'ymd HMS'),
         dia_inicio = as_date(fecha_de_inicio), 
         dia_de_semana = wday(dia_inicio,
                              label = T,
                              abbr = T)) %>%
  count(dia_de_semana,
        sort = T,
        name = "cantidad_salidas_por_dia") 

Ahora procedemos a la visualización de los resultados mediante un gráfico de barras geom_bar():

visualizacion_salidas_por_dia_semana <- dia_con_mas_demanda %>% 
  ggplot(aes(x=dia_de_semana,
             y = cantidad_salidas_por_dia,
             label = cantidad_salidas_por_dia,
             fill = dia_de_semana)) +
  geom_bar(stat='identity',
           width = 0.7,
           position = "nudge") +
  geom_text(size = 4, # tamaño de letra,
            position = position_stack(vjust = 1.05), # ubicación
            colour = 'black') +
  scale_fill_viridis(discrete = T) +
  scale_x_discrete(label = c("Sun"="Domingo", "Mon"="Lunes", "Tue"="Martes", "Wed"="Miércoles", "Thu"="Jueves", "Fri"="Viernes", "Sat"="Sábado")) +
  theme_minimal() +
  theme(legend.position = "none") +
  labs(x = 'Día de la semana',
       y = 'Cantidad de salidas',
       title = 'Cantidad de salidas por dia de semana',
       subtitle = 'desde Pacífico',
       caption = 'Fuente de datos: https://data.buenosaires.gob.ar/')

visualizacion_salidas_por_dia_semana

En el gráfico se observa que la cantidad de salidas desde la estación Pacífico para el año 2021 tienen su máximo en el día Martes, con un acumulado anual de 5634 salidas.

6.2 ¿A qué hora crece la demanda?

Para saber cómo crece por hora la demanda de ecobicis en la estación Pacífico en el año 2021 primero pondremos la fecha en un formato que nos permita acceder a la hora en que se realizó cada registro. Para ello, creamos una nueva variable que tenga el formato hour(). Luego contamos cuantos registros hay por cada hora del día a lo largo del año.

hora_con_mas_demanda <- bicis_21_pacífico %>%
  mutate(fecha_de_inicio = parse_date_time(fecha_origen_recorrido, 'ymd HMS'),
         hora_inicio = hour(fecha_de_inicio)) %>%
  count(hora_inicio,
        name="cantidad_de_salidas")

Obteniendo el siguiente dataset:

hora_inicio cantidad_de_salidas
0 585
1 584
2 295
3 165
4 200
5 175
6 458
7 1041
8 1468
9 1467
10 1199
11 1486
12 1676
13 2146
14 2123
15 2170
16 2490
17 3050
18 3013
19 2640
20 2253
21 1405
22 840
23 685

Es importante aclarar que se trata de la contidad de salidas desde Pacífico acumuladas a lo largo del año 2021. En caso de quere acceder a la media diaria de salidas por hora tenemos que dividir la cantidad anual de salidas que obtuvimos para cada hora por los 365 días del año. Para visualizar estos resultados utilizamos geom_line:

visualizacion_viajes_hora <- hora_con_mas_demanda %>% 
  ggplot(aes(x=hora_inicio,y = cantidad_de_salidas/365)) + 
  geom_line(aes(x=as.factor(hora_inicio), y = cantidad_de_salidas/365),
            group=1,
            color = 'orange',
            size = .5)+
  theme_minimal() +
  theme(legend.position = "none") +
  labs(x = 'Hora',
       y = 'Cantidad de salidas',
       title = 'Cantidad de salidas diarias por hora desde Pacífico')

ggplotly(visualizacion_viajes_hora, tooltip = c("x", "y"))

El gráfico muestra que la demanda de ecobicis en la estación Pacífico comienza a crecer a partir de las 5:00 AM, llegando a su máximo a las 17:00 PM.